//  (C) Copyright John Maddock 2006.
//  Use, modification and distribution are subject to the
//  Boost Software License, Version 1.0. (See accompanying file
//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

#include "test_gamma.hpp"
#ifdef TEST_MPFR
#include <nil/crypto3/multiprecision/mpfr.hpp>
#else
#include <nil/crypto3/multiprecision/cpp_bin_float.hpp>
#endif

void expected_results() {
    //
    // Define the max and mean errors expected for
    // various compilers and platforms.
    //
    const char* largest_type;
#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS
    if (boost::math::policies::digits<double, boost::math::policies::policy<>>() ==
        boost::math::policies::digits<long double, boost::math::policies::policy<>>()) {
        largest_type = "(long\\s+)?double";
    } else {
        largest_type = "long double";
    }
#else
    largest_type = "(long\\s+)?double";
#endif
    add_expected_result(".*",                                             // compiler
                        ".*",                                             // stdlib
                        ".*",                                             // platform
                        ".*",                                             // test type(s)
                        ".*near 1.*",                                     // test data group
                        ".*lgamma.*", 100000000000LL, 100000000000LL);    // test function
    add_expected_result(".*",                                             // compiler
                        ".*",                                             // stdlib
                        ".*",                                             // platform
                        ".*",                                             // test type(s)
                        ".*near 0.*",                                     // test data group
                        ".*lgamma.*", 300000, 100000);                    // test function
    add_expected_result(".*",                                             // compiler
                        ".*",                                             // stdlib
                        ".*",                                             // platform
                        ".*",                                             // test type(s)
                        ".*",                                             // test data group
                        ".*", 110000, 50000);                             // test function

    //
    // Finish off by printing out the compiler/stdlib/platform names,
    // we do this to make it easier to mark up expected error rates.
    //
    std::cout << "Tests run with " << BOOST_COMPILER << ", " << BOOST_STDLIB << ", " << BOOST_PLATFORM << std::endl;
}

BOOST_AUTO_TEST_CASE(test_main) {
    expected_results();
    BOOST_MATH_CONTROL_FP;

#ifdef TEST_MPFR
    typedef nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::mpfr_float_backend<450>> mp_type;
    const char* name = "number<mpfr_float_backend<450> >";
#else
    typedef nil::crypto3::multiprecision::number<nil::crypto3::multiprecision::cpp_bin_float<450>> mp_type;
    const char* name = "number<cpp_bin_float<450> >";
#endif

    test_gamma(mp_type(0), name);
}
